gdk_pixbuf_get_from_surface: Avoid copying if source is image surface
authorAlexander Larsson <alexl@redhat.com>
Tue, 6 Aug 2013 14:18:13 +0000 (16:18 +0200)
committerAlexander Larsson <alexl@redhat.com>
Wed, 7 Aug 2013 11:34:10 +0000 (13:34 +0200)
If the source surface is an image surface we don't need to coerce
it to one.

gdk/gdkpixbuf-drawable.c

index f8736bac7c802a08f03b9f5f694a7a4f6ae47016..59698f8ac0238640b6fb1a50ab68cdd5caf7c962 100644 (file)
@@ -248,9 +248,16 @@ gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
                          8,
                          width, height);
 
-  surface = gdk_cairo_surface_coerce_to_image (surface, content,
-                                               src_x, src_y,
-                                               width, height);
+  if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE)
+    surface = cairo_surface_reference (surface);
+  else
+    {
+      surface = gdk_cairo_surface_coerce_to_image (surface, content,
+                                                  src_x, src_y,
+                                                  width, height);
+      src_x = 0;
+      src_y = 0;
+    }
   cairo_surface_flush (surface);
   if (cairo_surface_status (surface) || dest == NULL)
     {
@@ -263,14 +270,14 @@ gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
                    gdk_pixbuf_get_rowstride (dest),
                    cairo_image_surface_get_data (surface),
                    cairo_image_surface_get_stride (surface),
-                   0, 0,
+                   src_x, src_y,
                    width, height);
   else
     convert_no_alpha (gdk_pixbuf_get_pixels (dest),
                       gdk_pixbuf_get_rowstride (dest),
                       cairo_image_surface_get_data (surface),
                       cairo_image_surface_get_stride (surface),
-                      0, 0,
+                      src_x, src_y,
                       width, height);
 
   cairo_surface_destroy (surface);